abstract class BaseViewModel {
}

abstract class BasePage<VM extends BaseViewModel> {
  viewModel: VM
}

class ShopViewModel extends BaseViewModel {
}

class ShopPage extends BasePage<ShopViewModel> {
}

type Cart<T> = { list: T[] } | T[];
let c1: Cart<string> = { list: ["1"] };
let c2: Cart<number> = [1];

function addToArray<T, U>(t: T, u: U): [T, U] {
  return [t, u]
}

